import Vue from 'vue'
import VueRouter from 'vue-router'

import service from "@/utils/request";
import {restoredyroutes1} from "@/router/index1";
Vue.use(VueRouter)
//动态路由数据，这个数组数据动态生成，然后由此数据生成菜单及最终的路由信息。
//动态路由数据，这个数组数据动态生成，通过深拷贝原始数据恢复dyroutes，origindyroutes=>dyroutes然后由此数据生成菜单及最终的路由信息。
//这里必须使用restoredyroutes1函数通过深拷贝恢复！ dyroutes，origindyroutes=>dyroutes，因为如果修改角色权限后logout退出，再次进入系统时
// 需要恢复所有动态路由，然后删除没有权限的路由，如果直接用dyroutes = origindyroutes复制，则原始的动态路由已经被破坏，就无法恢复所有路由了。
export var dyroutes = []
//淘汰的函数
//从后端数据库中传来的allmenus还原所有动态路由，
// 暂时不用这个方法了,用index1中的方法来还原dyroutes数组。
//此方法要求再后端数据库中维护路由数据，比较麻烦，改为在index1.js中维护所有路由数据了。
function restoreAllDyroutes(dyroutespar, allmenus) {

    //这段代码用forEach实现功能正常，但是如果换用for循环，则出问题所有模块显示数据库中最后一个模块，不知道问什么。。。。。下面注释掉的就是出错for循环的代码
    allmenus.forEach(item=>{
        var str = item.pagefile.substring(9)
        var o = {
            name: item.name,
            path: item.path,
            //虽然ES6的import()是支持动态引入的，但由于Webpack编译时查找模块的特性，import(path)的path不能完全为动态（完全动态时为运行时查找模块），所以需要指定特定的部分模块路径信息
            component: () => import('../views/' + str),
            children: []
        }
        dyroutespar.push(o)
        if (item.children != null && item.children.length > 0) {
            dyroutespar.forEach(dyroutesitem=>{
                if(dyroutesitem.name == item.name){
                    restoreAllDyroutes(dyroutesitem.children, item.children)
                }
            })

        }
    })
    // for (var i = 0; i < allmenus.length; i++) {
    //     console.log('@@@@-------------i=' + i)
    //     // console.log(menus[i])
    //     // var o = {name: menus[i].name, path: menus[i].path, component:()=>import(menus[i].pagefile),children: []}
    //     var str = allmenus[i].pagefile
    //     str = allmenus[i].pagefile.substring(9)
    //     console.log(str)
    //     var o = {
    //         name: allmenus[i].name,
    //         path: allmenus[i].path,
    //         //虽然ES6的import()是支持动态引入的，但由于Webpack编译时查找模块的特性，import(path)的path不能完全为动态（完全动态时为运行时查找模块），所以需要指定特定的部分模块路径信息
    //         component: () => import('../views/' + str),
    //         children: []
    //     }
    //     console.log(o)
    //     dyroutespar.push(o)
    //     if (allmenus[i].children != null && allmenus[i].children.length > 0) {
    //         restoreAllDyroutes(dyroutespar[i].children, allmenus[i].children)
    //     }
    // }
}

export function resetRoutes(allmenus) {
    console.log('resetRoutes called')
    // while (dyroutes.length > 0) {
    //     dyroutes.pop()
    // }
    dyroutes=[]


    // var str = '[{"id":1,"name":"主页","path":"/","pid":null,"pagefile":"../views/DEVLayout.vue","children":[{"id":2,"name":"菜单管理","path":"menu","pid":1,"pagefile":"../views/Menu.vue","children":null},{"id":3,"name":"指标下载","path":"zb","pid":1,"pagefile":"../views/ZhiBiao.vue","children":null},{"id":4,"name":"文件管理","path":"file","pid":1,"pagefile":"../views/File.vue","children":null},{"id":5,"name":"用户管理","path":"user","pid":1,"pagefile":"../views/User.vue","children":null},{"id":6,"name":"角色管理","path":"role","pid":1,"pagefile":"../views/Role.vue","children":null},{"id":7,"name":"城市","path":"city","pid":1,"pagefile":"../views/City.vue","children":null}]}]'
    // var allmenus = JSON.parse(str)
    //
    // console.log('======allmensus')
    // console.log(allmenus)
    // restoreAllDyroutes(dyroutes, allmenus)
    // // console.log('after addAllDyRoutes-============')
    // // console.log(dyroutes)
    // setRouterByRights()
    // setTimeout(1000,router.push('/'))
    // router.push('/')

    service.get('/menu/getpage', {
        params: {
            pageSize: 100,
            pageNum: 1,
        }
    }).then(response => {
            if (response.data.code == 20000) {
                // this.tableData = response.data.data.records;
                // this.total = response.data.data.total;
                // this.currentPage = response.data.data.current;
                // this.pageSize = response.data.data.size;
                var allmenus = response.data.data.records;
                // console.log('======allmensus')
                // console.log(JSON.stringify(allmenus))
                // restoreAllDyroutes(dyroutes, allmenus)
                //恢复所有的动态路由
                restoredyroutes1()
                let user = JSON.parse(sessionStorage.getItem('user'))
                // if(user.username == 'admin'){
                //     console.log('dfdfdf==================')
                //     return
                // }

                // if(user)
                console.log('after addAllDyRoutes-============')
                console.log(dyroutes)
                setRouterByRights()
                // router.push('/')
            }
        },
        error => {
            alert(error.message)
            // ElementUI.Message({
            //     message: error.message,
            //     type: 'error'
            // })
        }
    );
}

//此处添加固定路由,同时要在setRouterByRights（）函数中的routes数组中也添加相同的路由
const routes = [
    {path: '/login', name: '登录', component: () => import('../views/Login.vue')},
]

//根据用户拥有的菜单权限menus处理动态路由dyroutes，主要是删除没有权限的路由。
//使用了递归算法！
function delRoutesByRights(dyroutes, menurights) {
    if (dyroutes == null || dyroutes.length == 0)
        return

    var newArr = []

    for (var i = 0; i < dyroutes.length; i++) {
        for (var j = 0; j < menurights.length; j++) {
            if (menurights[j].name == dyroutes[i].name) {
                // console.log('menus[j].name===' + menus[j].name)
                newArr.push(dyroutes[i])
                break
            } else {
                // console.log('menus[j].name!='+menus[j].name)
            }
        }
    }
    // dyroutes.length = 0
    while (dyroutes.length > 0) {
        dyroutes.pop()
    }

    for (var i = 0; i < newArr.length; i++) {
        dyroutes.push(newArr[i])
    }
    if (dyroutes.length > 0) {
        for (var i = 0; i < dyroutes.length; i++) {
            delRoutesByRights(dyroutes[i].children, menurights)
        }
    }
}


export function setRouterByRights() {

    var menurights = null

    //删除用户没有的权限,此步操作完后dyroutes中就是此用户拥有的动态路由
    if ((menurights = sessionStorage.getItem('menurights')) != null) {
        menurights = JSON.parse(menurights)
        delRoutesByRights(dyroutes, menurights)
    }
    //这里是笨方法，我还不知道别的办法
    // 创建一个新的newRouter代替原来的router，这个newRouter恢复了所有的固定路由，及用户所拥有的动态路由
    const newRouter = new VueRouter({
        // mode: 'history', //hash history后端支持可开,需配置nginx， 次模式下不会再返回404界面
        //此出routes要与上面的全局routes相同
        routes: [
            {path: '/login', name: '登录', component: () => import('../views/Login.vue')},
        ] // 路由路径
        // scrollBehavior: () => ({ y: 0 }) // 在切换时定位路由滚动条的位置
    })

    router.matcher = newRouter.matcher

    // for (var i = 0; i < dyroutes.length; i++) {
    //     router.addRoute(dyroutes[i])
    // }
    router.addRoutes( dyroutes )


}

const router = new VueRouter({
    routes
})

resetRoutes()

router.beforeEach((to, from, next) => {

    // if (to.path == from.path) {
    //     return
    // }
    // console.log('to.path = : ', to.path)
    if (to.path == '/zb' || to.path == '/qx') {
        // console.log('to.path == /zb || /qx ')
        next()
        return
    }
    if (to.path != '/login' && to.path != '/about') {
        if (!sessionStorage.getItem('user')) {
            next('/login')
        } else {
            next()
        }
    } else {
        next()
    }
})
//这段代码是网上拷贝的，去掉就会出现错误：NavigationDuplicated：Avoided redundant navigation to current location
// 从网上百度的解决方法：vue项目NavigationDuplicated：Avoided redundant navigation to current location（重复请求相同路径警告）解决办法
//从代码看似乎只是用catch隐藏了错误
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
    return originalPush.call(this, location).catch(err => err)
}

export default router
